/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/
//定义按键引脚
#define KEY1_State P32
/* Private variables----------------------------------------------------------*/
static void KEY_Detect();
/* Public variables-----------------------------------------------------------*/
KEY_t KEY1 = {FALSE,FALSE,FALSE,FALSE,KEY_Detect};
/* Private function prototypes------------------------------------------------*/

/*
* @name   KEY_Detect
* @brief  按键检测
* @param  None
* @retval None   
*/
static void KEY_Detect()
{
    static uint16_t i;
    //单击检测
    if(KEY1.KEY_Flag == TRUE)        //外部中断改变标志位的值，说明按键被按下
    {
        KEY1.KEY_Flag = FALSE;       //标志位重新置0，为下次按键准备
        EX0 = 0;                    //关闭中断
        if(KEY1_State == 0)
        {
            Public.Delay_ms(5);         //虽然硬件已经有消抖功能，软件再做一次
            if(KEY1_State == 0)
            {
                KEY1.Click = TRUE;       //单击标志位置1
            }
        }
    }
    //长按检测
    if(KEY1.Click == TRUE)
    {
        KEY1.Press = TRUE;               //如果有按键按下，默认会进行长按
        for(i = 0;i<200;i++)            //每次循环延时10ms，即延时2秒
        {
            //喂狗
            WatchDog.Feed();
            
            Public.Delay_ms(10);
            if(KEY1_State == 1)          //如果这期间按键松开了，则达不到长按的条件
            {
                KEY1.Press = FALSE;      //长按标志位清0
                break;                  //提前结束延时
            }
        }
    }
    EX0 = 1;                        //打开中断

    //按键功能
    //单击 -> 从待机模式唤醒，进入运行模式
    if(KEY1.Click == TRUE)
    {
        if(System.ucSystem_Statues == System_Standby)
        {
            System.ucSystem_Statues = System_Run;

            //串口打印调试信息
            #ifdef Monitor_Run_Code
                printf("The key is clicked,the system enters run mode\r\n\r\n");
            #endif

            //进入运行模式后运行指示灯闪烁一下
            //定时器0中断服务函数中，msMCU_Timer0_Value>=TIMER0_1S则灯闪烁
            Timer0.msMCU_Timer0_Value = TIMER_1S;
        }
    }
    //长按 -> 进入待机模式
    if(KEY1.Press == TRUE)
    {
        if(System.ucSystem_Statues == System_Run)
        {
             System.ucSystem_Statues = System_Standby;

             //串口打印调试信息
            #ifdef Monitor_Run_Code
                printf("The key is pressed,the system enters standby mode\r\n\r\n");
            #endif
        }

        //运行指示灯闪烁8下
        i = 8;
        while(i--)
        {
            Run_LED.Run_LED_Flip();
            Public.Delay_ms(100);
        }
    }

    //清除按键标志位
    KEY1.Click = FALSE;
    KEY1.Press = FALSE;
}

/*
* @name   INT0_isr
* @brief  外部中断0中断处理函数
* @param  None
* @retval None   
*/
void INT0_isr() interrupt 0
{
    KEY1.KEY_Flag = TRUE;
    //Run_LED.Run_LED_Flip();
}
/********************************************************
  End Of File
********************************************************/